package com.stars.entity.mygenerate;
/**
 * Created by luodajie on 2019/1/7.
 */


import com.stars.common.WheterYN;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author :dj
 * @version : 1.0.0
 * @description
 * @Date 2019-01-07 19:15
 * @note
 */
public class MysqlAutoGenerateTable {
    public static String createMysqlDbTable(String tableName, List<CgFormField> cgFormFieldList) {
        List<TemplateFieldConfig> fieldConfigList = toFieldSQL(cgFormFieldList);

        StringBuilder jdbcSql = new StringBuilder("CREATE TABLE `" + tableName + "` (");
        //创建表，添加字段
        StringBuilder key = new StringBuilder("id");
        for (TemplateFieldConfig f : fieldConfigList) {
            if(StringUtils.isNotBlank(f.getDictTable())){
                continue;
            }
            jdbcSql.append("`" + f.getName() + "` " + f.getType() + "  " + f.getIsNull() + "  COMMENT '" + f.getComment() + "', ");
            //添加主键
            if (WheterYN.YES.getValue().equals(f.getIsKey()) && !"id".equals(f.getName())) {
                key.append("," + f.getName());
            }
        }
        jdbcSql.append("  PRIMARY KEY (`" + key + "`) USING BTREE  ");
        jdbcSql.append(")");
        return jdbcSql.toString();
    }

    /**
     * 生成数据表字段对象
     * id varchar(12)  NOT NULL COMMENT 'id',
     *
     * @param cgFormFieldList 名称，类型（string,int,date,double,long），字段大小，是否为空，是否是key,字段说明
     * @return
     */
    private static List<TemplateFieldConfig> toFieldSQL(List<CgFormField> cgFormFieldList) {
        List<TemplateFieldConfig> templateFieldConfigList = new ArrayList<>();
        for (CgFormField cgFormField : cgFormFieldList) {
            TemplateFieldConfig templateFieldConfig = new TemplateFieldConfig();
            templateFieldConfig.setName(cgFormField.getName());
            templateFieldConfig.setComment(cgFormField.getText());
            templateFieldConfig.setDictTable(cgFormField.getDictTable());
            //类型
            for (MysqlFieldType fieldType : MysqlFieldType.values()) {
                if (fieldType.getName().equals(cgFormField.getType())) {
                    if (MysqlFieldType.INT.getName().equals(cgFormField.getType())) {
                        cgFormField.setLength(11);
                    }
                    if (MysqlFieldType.BIGINT.getName().equals(cgFormField.getType())) {
                        cgFormField.setLength(20);
                    }
                    if (MysqlFieldType.DATE.getName().equals(cgFormField.getType())) {
                        templateFieldConfig.setType(fieldType.getType());
                        break;
                    }
                    if (MysqlFieldType.DATETIME.getName().equals(cgFormField.getType())) {
                        templateFieldConfig.setType(fieldType.getType());
                        break;
                    } if (MysqlFieldType.TEXT.getName().equals(cgFormField.getType())) {
                        templateFieldConfig.setType(fieldType.getType());
                        break;
                    }
                    if (MysqlFieldType.DOUBLE.getName().equals(cgFormField.getType())) {
                        templateFieldConfig.setType(fieldType.getType() + "(20,3)");
                    } else {
                        templateFieldConfig.setType(fieldType.getType() + "(" + cgFormField.getLength() + ")");
                    }

                    break;
                }
            }

            // 不能为空
            if (WheterYN.YES.getValue().equals(cgFormField.getNotEmpty())|| "id".equals(cgFormField.getName())) {
                templateFieldConfig.setIsNull("NOT NULL");
            }
            //是否是主键
            if (WheterYN.YES.getValue().equals(cgFormField.getIsKey())) {
                templateFieldConfig.setIsKey(WheterYN.YES.getValue());
            }
            templateFieldConfigList.add(templateFieldConfig);
        }

        return templateFieldConfigList;
    }

    /**
     * 生成树形父类函数
     * 根据当前节点过去所有父节点
     * @param tableName 表名
     */
    public static  String createTreeParentFunction(String tableName){
        StringBuilder jdbcSql = new StringBuilder("CREATE  FUNCTION `" + tableName + "_get_parent` (rootId TEXT) RETURNS text CHARSET utf8");
        jdbcSql.append(" DETERMINISTIC");
        jdbcSql.append(" SQL SECURITY INVOKER");
        jdbcSql.append(" COMMENT '根据当前节点过去所有父节点'");
        jdbcSql.append(" BEGIN");
        jdbcSql.append(" DECLARE fid VARCHAR (100) DEFAULT '' ;");
        jdbcSql.append(" DECLARE str VARCHAR (1000) DEFAULT rootId ;");
        jdbcSql.append(" WHILE ");
        jdbcSql.append(" rootId IS NOT NULL DO SET fid =");
        jdbcSql.append(" (SELECT PID FROM  "+tableName +" WHERE id = rootId); ");
        jdbcSql.append(" IF fid IS NOT NULL");
        jdbcSql.append(" THEN SET str = CONCAT(str, ',', fid) ;");
        jdbcSql.append(" SET rootId = fid ;");
        jdbcSql.append(" ELSE SET rootId = fid ;");
        jdbcSql.append(" END IF ;");
        jdbcSql.append(" END WHILE ;");
        jdbcSql.append(" RETURN str ;");
        jdbcSql.append(" END");
        return jdbcSql.toString();
    }

    /**
     * 生成树形子类函数
     * 查询所有孩子节点，包括孩子的孩子
     * @param tableName 表名
     */
    public static String createTreeChildFunction(String tableName){
        StringBuilder jdbcSql = new StringBuilder("CREATE  FUNCTION `" + tableName + "_get_child` (rootId TEXT) RETURNS text CHARSET utf8");
        jdbcSql.append(" DETERMINISTIC");
        jdbcSql.append(" SQL SECURITY INVOKER");
        jdbcSql.append(" COMMENT '查询所有孩子节点，包括孩子的孩子'");
        jdbcSql.append(" BEGIN");
        jdbcSql.append(" DECLARE ptemp VARCHAR (1000) ;");
        jdbcSql.append(" DECLARE ctemp VARCHAR (1000) ;");
        jdbcSql.append(" SET ptemp = '#' ;");
        jdbcSql.append(" SET ctemp = rootId ;");
        jdbcSql.append(" WHILE ");
        jdbcSql.append(" ctemp IS NOT NULL DO SET ptemp = CONCAT(ptemp, ',', ctemp) ;");
        jdbcSql.append(" SELECT GROUP_CONCAT(id) INTO ctemp FROM  "+tableName +" WHERE FIND_IN_SET(pid, ctemp) > 0 ; ");
        jdbcSql.append(" END WHILE ;");
        jdbcSql.append(" RETURN ptemp ;");
        jdbcSql.append(" END");

        return jdbcSql.toString();
    }

    public static void main(String[] args) {
        String treeParentFunction = createTreeParentFunction( "test_tree");
        System.out.println(treeParentFunction);
        String treeChildFunction = createTreeChildFunction("test_tree");
        System.out.println(treeChildFunction);

//        List<CgFormField> cgFormFieldList = new ArrayList<>();
//        CgFormField cgFormField = new CgFormField();
//        cgFormField.setName("id");
//        cgFormField.setText("id");
//        cgFormField.setLength(36);
//        cgFormField.setFiledMustInput("Y");
//        cgFormFieldList.add(cgFormField);
//
//        CgFormField cgFormField2 = new CgFormField();
//        cgFormField2.setName("name");
//        cgFormField2.setText("名称");
//        cgFormFieldList.add(cgFormField2);
//
//        CgFormField cgFormField23= new CgFormField();
//        cgFormField23.setName("createDate");
//        cgFormField23.setType("date");
//        cgFormField23.setText("时间");
//        cgFormFieldList.add(cgFormField23);
//
//        CgFormField cgFormField4= new CgFormField();
//        cgFormField4.setName("age");
//        cgFormField4.setType("int");
//        cgFormField4.setText("年龄");
//        cgFormFieldList.add(cgFormField4);
//        CgFormField cgFormField5= new CgFormField();
//        cgFormField5.setName("age1");
//        cgFormField5.setType("double");
//        cgFormField5.setText("年龄1");
//        cgFormFieldList.add(cgFormField5);
//
//        CgFormField cgFormField6= new CgFormField();
//        cgFormField6.setName("age12");
//        cgFormField6.setType("string");
//        cgFormField6.setText("年龄122");
//        cgFormField6.setFiledMustInput("Y");
//        cgFormField6.setLength(1);
//        cgFormFieldList.add(cgFormField6);
//
//        String jdbcSql = createMysqlDbTable("sys_test", cgFormFieldList);
//        System.out.println(jdbcSql);


    }

    /**
     * 添加表基础字段
     * @param tableName 表名称
     * @return sql
     */
    public static String addBaseField(String tableName,String type) {
        StringBuilder jdbcSql = new StringBuilder("alter table `" + tableName + "` add(");
        jdbcSql.append(" CREATE_NAME VARCHAR(80) COMMENT '创建人',");
        jdbcSql.append(" CREATE_ID VARCHAR(36) COMMENT '创建人ID',");
        jdbcSql.append(" CREATE_DATE DATETIME COMMENT '创建时间',");
        jdbcSql.append(" LAST_UPDATE_DATE DATETIME COMMENT '最后修改时间',");
        jdbcSql.append(" LAST_UPDATE_ID VARCHAR(36) COMMENT '最后修改人ID',");
        jdbcSql.append(" LAST_UPDATE_NAME VARCHAR(80) COMMENT '最后修改人',");
        jdbcSql.append(" VERSION int(7) DEFAULT '1' COMMENT '版本',");
        if("2".equals(type)){
            addCompany(jdbcSql);
        }else if("3".equals(type)){
            addOrg(jdbcSql);
        }else if("4".equals(type)){
            addApp(jdbcSql);
        }
        jdbcSql.append(" IS_DELETE int(2) DEFAULT '0' COMMENT '是否删除', ");
        jdbcSql.append(" IS_ENABLE int(2) DEFAULT '1' COMMENT '是否启用'");

        jdbcSql.append(" );");
        return jdbcSql.toString();
    }
    private static void addCompany(StringBuilder jdbcSql){
        jdbcSql.append(" COMPANY_ID VARCHAR(36) COMMENT '公司ID' ,");
        jdbcSql.append(" COMPANY_CODE VARCHAR(20) COMMENT '公司代码',");
        jdbcSql.append(" COMPANY_NAME VARCHAR(100) COMMENT '公司名称',");
    }
    private static void addOrg(StringBuilder jdbcSql){
        addCompany(jdbcSql);
        jdbcSql.append(" ORG_ID VARCHAR(36) COMMENT '组织ID',");
        jdbcSql.append(" ORG_CODE VARCHAR(20) COMMENT '组织代码',");
        jdbcSql.append(" ORG_NAME VARCHAR(100) COMMENT '组织名称',");
    }
    private static void addApp(StringBuilder jdbcSql){
        addOrg(jdbcSql);
        jdbcSql.append(" APP_ID VARCHAR(36) COMMENT '系统ID',");
        jdbcSql.append(" APP_NAME VARCHAR(100) COMMENT '系统名称',");
    }


}
